#include "SelectionListe.h"

#include "Key.h"

#include "lib.h"

#include <iostream>

#include <QtGui/QApplication>

using namespace std;

/**
 * Constructeur permettant de créer un choix à partir d'une liste de
 * noms, où les items ont un coût, également donné en argument.
 *
 * Le niveau de sortie est paramétré par BaseUI::interne :\n
 * - \e FUNC  affiche les messages de début et de fin de méthode.\n
 *
 * @param nbr nombre d'objets à choisir.
 * @param noms pointeur sur le conteneur des noms des différents
 * éléments. Attention ici c'est un pointeur sur un tableau constant!
 * @param couts pointeur sur le conteneur des coûts des différents
 * éléments. Attention ici c'est un pointeur sur un tableau constant!
 * @param pp nombre de pp pouvant être dépensés.
 * @param titre nom du cadre affiché autour des items.
 * @param parent pointeur sur le widget parent (orphelin par défaut).
 */
SelectionListe::SelectionListe(const unsigned int& nbr,
 			       const vector< string >* noms,
			       const vector< unsigned int >* couts,
 			       const unsigned int& pp, const string& titre,
 			       QWidget* parent)
  : BaseListeSel( nbr, noms, couts, pp, titre, "SelectionListe", parent)
{
  prepareBoutons();

  setFenetreLayout();
}

/**
 * Constructeur permettant de créer un choix à partir d'une liste de
 * noms, où les items ont un coût, également donné en argument. Ce
 * constructeur est utilisé pour le choix de compétences diverses,
 * dons et désavantages par exemple.
 *
 * La liste des noms et celle des coûts sont ici données par un
 * pointeur sur un tableau (supposé statique), alors on copie leurs
 * éléments dans les listes internes.
 *
 * Le niveau de sortie est paramétré par BaseUI::interne :\n
 * - \e FUNC  affiche les messages de début et de fin de méthode.\n
 *
 * @param nbr nombre d'objets à choisir.
 * @param ptr pointeur sur le noms des différents éléments.
 * @param ptr_cout pointeur sur le premier des coûts.
 * @param pp nombre de pp pouvant être dépensés.
 * @param titre nom du cadre affiché autour des items.
 * @param parent pointeur sur le widget parent (orphelin par défaut).
 */
SelectionListe::SelectionListe(const unsigned int& nbr, string* ptr,
			       int* ptr_cout, const unsigned int& pp,
			       const string& titre, QWidget* parent)
  :BaseListeSel( nbr, ptr, ptr_cout, pp, titre, "SelectionListe", parent )
{
  prepareBoutons();

  setFenetreLayout();
}

/**
 * Constructeur permettant de créer un choix à partir d'une liste de
 * noms, où les items ont un coût, également donné en argument. Ce
 * constructeur est utilisé pour le choix de compétences diverses,
 * dons et désavantages par exemple.
 *
 * La liste des noms et celle des coûts sont ici données par un
 * pointeur sur un tableau (supposé statique), alors on copie leurs
 * éléments dans les listes internes.
 *
 * Le niveau de sortie est paramétré par BaseUI::interne :\n
 * - \e FUNC  affiche les messages de début et de fin de méthode.\n
 *
 * @param nbr nombre d'objets à choisir.
 * @param ptr pointeur sur le noms des différents éléments. Attention
 * ici c'est un pointeur sur un élément constant du tableau!
 * @param ptr_cout pointeur sur le premier des coûts.
 * @param pp nombre de pp pouvant être dépensés.
 * @param titre nom du cadre affiché autour des items.
 * @param parent pointeur sur le widget parent (orphelin par défaut).
 */
SelectionListe::SelectionListe(const unsigned int& nbr, const string* ptr,
			       int* ptr_cout, const unsigned int& pp,
			       const string& titre, QWidget* parent)
  :BaseListeSel( nbr, ptr, ptr_cout, pp, titre, "SelectionListe", parent )
{
  prepareBoutons();

  setFenetreLayout();
}

/** Constructeur de copie.
 * Permet de dupliquer une instance de SelectionListe.
 *
 * @param selListe instance à dupliquer.
 */
SelectionListe::SelectionListe(const SelectionListe& selListe)
  : BaseListeSel( selListe )
{
  prepareBoutons();

  setFenetreLayout();
}

/**
 * Destructeur, ne fait rien de spécial.
 */
SelectionListe::~SelectionListe()
{}

/** Affiche la fenêtre et permet d'effectuer le choix dans liste.
 * Une fois le choix validé, on rempli le conteneur avec les items
 * sélectionnés.
 *
 * Est redéfinie afin de retourner également le nombre de PP restants.
 *
 * @param vec conteneur de la liste des éléments choisis.
 * @return StatusCode \e true si choix validé, \e false sinon, le
 * nombre de PP restant est stocké dans valeur().
 */
StatusCode SelectionListe::Choisir(vector<unsigned int>& vec)
{
  vec.clear();

  this -> show();
  
  qApp -> exec();
  
  for (unsigned int i(0); i < dimension; i++)
    {
      if (aChoisi[i])
	vec.push_back(i);
    }
     
  return StatusCode( OK, PP );
}

